#include <iostream>
#include <unistd.h>

using namespace std;

class Singleton // 懒汉
{
    Singleton() // 该类不能在外被构造
    {
        cout << "程序运行时就打印该信息" << endl;
    }
    ~Singleton() {}                                   // 该类不能在外被析构
    Singleton(const Singleton &) = delete;            // 该类不能在外被拷贝
    Singleton &operator=(const Singleton &) = delete; // 该类不能在外被赋值

    static Singleton *data;       // 使用Singleton*作为访问唯一对象的入口
    static pthread_mutex_t lock_; // 保证线程安全
public:
    static Singleton *GetInstance() // 外部只能通过调用该函数拿到data指针
    {
        if (data == nullptr)
        {
            pthread_mutex_lock(&lock_);
            if (data == nullptr)
                data = new Singleton();
            pthread_mutex_unlock(&lock_);
        }

        return data;
    }
};

Singleton* Singleton::data = nullptr; // data的初始化
pthread_mutex_t Singleton::lock_ = PTHREAD_MUTEX_INITIALIZER;//锁的初始化

int main()
{
    //只有调用GetInstance时，才会开辟空间
    cout << Singleton::GetInstance() << endl;
    return 0;
}
